home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -in_the_mag- / reader_requests / scilab / bin / dold < prev    next >
Text File  |  1999-09-16  |  2KB  |  84 lines

  1. #!/bin/sh5
  2. OBJNM=/tmp/objnm$$
  3. JMPTAB=/tmp/jmptab$$
  4. #    Separons les .o des autres arguments
  5. while test $# -ge 1; do
  6. case $1 in
  7.         -r) OPTARG="$OPTARG -N";;
  8.         -G) case $2 in 0) shift;; *) OPTARG="$OPTARG $1";; esac;;
  9.     -A) BASEBIN=$2; shift;;
  10.     *.o) OBJARG="$OBJARG $1";;
  11.     -o) OPTARG="$OPTARG $1"; OUTBIN=$2;;
  12.     -e) ENTRY=$2; shift;;
  13.     *) OPTARG="$OPTARG $1";;
  14. esac
  15. shift; done
  16.  
  17. SCITXTNM=$BASEBIN.txtnm
  18. SCIDATNM=$BASEBIN.datnm
  19. #    Si les fichiers de table des symboles n'existent pas, tentons
  20. #    de les creer.
  21. { test -f $SCITXTNM && test -f $SCIDATNM; } ||
  22. { nm $BASEBIN > $BASEBIN.nm &&
  23. { grep ' T ' $BASEBIN.nm > $SCITXTNM
  24.   grep ' [A-SU-Z] ' $BASEBIN.nm > $SCIDATNM
  25.   rm $BASEBIN.nm
  26. }
  27. }
  28. #    Si les fichiers de table des symboles n'existent tojours pas,
  29. #    inutile de continuer
  30. { test -f $SCITXTNM && test -f $SCIDATNM; } || exit 1
  31.  
  32. #    Creons la liste des symboles indefinis de ces .o
  33. nm -u $OBJARG | sed -n '/^  *U /s///p' | sort -u > $OBJNM
  34. #    Creons l'intersection de cette liste avec celle des symboles de scilab
  35. #    et produisons un source assembleur qui definit ces symboles et cres
  36. #    les branchements indirects
  37. grep ' A _gp$' $SCIDATNM | (read ADDR SKIP; echo ".lowgp=0x$ADDR" >>$JMPTAB.s)
  38. join -j1 1 -j2 3 -o 2.3 2.1 $OBJNM $SCITXTNM | \
  39. while read NAME ADDR
  40. do cat <<EOF
  41. .$NAME=0x$ADDR
  42.     .globl    $NAME
  43. 1:    .word    0
  44. $NAME:    sw    \$31,1b
  45.     la    \$8,.$NAME
  46.     li    \$28,.lowgp
  47.     jal    \$8
  48.     lw    \$31,1b
  49.     la    \$28,_gp
  50.     j    \$31
  51. EOF
  52. done >> $JMPTAB.s
  53. #    Ajoutons le code de commutation de gp
  54. cat >>$JMPTAB.s <<EOF
  55. savra:    .word    0
  56.     .globl    $ENTRY
  57.     .globl    .$ENTRY
  58. .$ENTRY:
  59.     sw    \$31,savra
  60.     la    \$28,_gp
  61.     jal    $ENTRY
  62.     lw    \$31,savra
  63.     la    \$28,.lowgp
  64.     j    \$31    
  65. EOF
  66. echo "    .data" >>$JMPTAB.s
  67. #    Ajoutons des definitions pour les symboles de data
  68. join -j1 1 -j2 3 -o 2.3 2.1 $OBJNM $SCIDATNM | \
  69. while read NAME ADDR
  70. do echo ".globl $NAME;$NAME=0x$ADDR"
  71. done  >> $JMPTAB.s
  72.  
  73. #    Assemblons le resultat
  74. as $JMPTAB.s -o $JMPTAB.o
  75. #    Y a plus qu'a faire l'edition de liens
  76. ld $OBJARG $JMPTAB.o $OPTARG -e .$ENTRY
  77. #    sauvons le status
  78. STATUS=$?
  79. rm $JMPTAB.[so] $OBJNM
  80. #    c'est correct si le link s'est bien passe et qu'il nde reste pas
  81. #    d'indefini(s).
  82. test $STATUS -eq 0 && STATUS=`nm -u $OUTBIN | wc -l` && { test $STATUS -eq 0 ||  { echo $STATUS undefined:;nm -u $OUTBIN; }; }
  83. exit $STATUS
  84.